#!/bin/bash

# 定义前后端目录路径
FRONTEND_DIR="/home/inta/KuaiCheZuChe/frontend"
BACKEND_DIR="/home/inta/KuaiCheZuChe/backend"

# 进程ID文件
PID_FILE="/tmp/kuaiche_services.pid"

# 打印帮助信息
print_help() {
    echo "用法: $0 [命令]"
    echo "命令选项:"
    echo "  start    - 启动服务 (默认)"
    echo "  stop     - 停止服务"
    echo "  status   - 查看服务状态"
    echo "  restart  - 重启服务"
    echo "  help     - 显示此帮助信息"
}

# 检查目录是否存在
check_directories() {
    [ -d "$FRONTEND_DIR" ] || { echo "错误: 前端目录不存在: $FRONTEND_DIR"; exit 1; }
    [ -d "$BACKEND_DIR" ] || { echo "错误: 后端目录不存在: $BACKEND_DIR"; exit 1; }
}

# 检查必要命令是否存在
check_commands() {
    command -v http-server >/dev/null 2>&1 || { echo "错误: http-server 未安装，请先安装 Node.js 和 http-server"; exit 1; }
    command -v mvn >/dev/null 2>&1 || { echo "错误: mvn (Maven) 未安装"; exit 1; }
}

# 根据端口号查找进程ID
find_pid_by_port() {
    local port=$1
    # 尝试多种方法查找监听指定端口的进程
    lsof -ti :$port 2>/dev/null || ss -ltnpu | awk -v port=":$port" '$5 ~ port {split($6, a, ":"); print a[2]}' 2>/dev/null | head -1
}

# 检查数据库是否需要初始化
check_database_initialization() {
    echo "\n=== 数据库检查 ==="
    echo "请注意：首次运行服务前，请先执行数据库初始化脚本！"
    echo "初始化命令：bash /home/inta/KuaiCheZuChe/database/init_db.sh"
    echo "初始化脚本会创建数据库、用户和必要的表结构。"
    echo "（注意：该脚本只需执行一次，数据库初始化完成后不需要重复执行）"
    echo "================\n"
    
    # 暂停2秒，让用户有时间阅读提示
    sleep 2
}

# 启动服务
start_services() {
    echo "正在启动服务..."
    
    # 检查数据库是否需要初始化
    check_database_initialization
    
    # 检查是否已在运行
    if [ -f "$PID_FILE" ]; then
        echo "服务似乎已在运行 (找到PID文件)"
        status_services
        exit 1
    fi
    
    # 检查端口是否已被占用
    if [ -n "$(find_pid_by_port 8000)" ]; then
        echo "错误: 端口8000已被占用"
        exit 1
    fi
    
    if [ -n "$(find_pid_by_port 8080)" ]; then
        echo "错误: 端口8080已被占用"
        exit 1
    fi
    
    # 启动前端服务
    echo "启动前端服务 (http-server -p 8000)..."
    # 检查前端目录结构，确定正确的启动路径
    if [ -d "$FRONTEND_DIR/public" ]; then
        echo "检测到 public 子目录，将在该目录启动服务（符合现代网站构建规则）"
        cd "$FRONTEND_DIR/public" && http-server -p 8000 > /tmp/frontend.log 2>&1 &
    elif [ -d "$FRONTEND_DIR/dist" ]; then
        echo "检测到 dist 子目录，将在该目录启动服务"
        cd "$FRONTEND_DIR/dist" && http-server -p 8000 > /tmp/frontend.log 2>&1 &
    elif [ -d "$FRONTEND_DIR/src" ]; then
        echo "检测到 src 子目录，将在该目录启动服务"
        cd "$FRONTEND_DIR/src" && http-server -p 8000 > /tmp/frontend.log 2>&1 &
    else
        echo "在前端根目录启动服务"
        cd "$FRONTEND_DIR" && http-server -p 8000 > /tmp/frontend.log 2>&1 &
    fi
    FRONTEND_PID=$!
    
    # 启动后端服务
    echo "启动后端服务 (mvn spring-boot:run)..."
    cd "$BACKEND_DIR" && mvn spring-boot:run > /tmp/backend.log 2>&1 &
    BACKEND_PID=$!
    
    # 保存PID到文件
    echo "$FRONTEND_PID $BACKEND_PID" > "$PID_FILE"
    
    # 等待一会儿让服务启动
    sleep 5
    
    # 检查进程是否仍在运行
    if kill -0 $FRONTEND_PID 2>/dev/null && kill -0 $BACKEND_PID 2>/dev/null; then
        echo "服务启动成功!"
        echo "- 前端服务运行在 http://localhost:8000 (PID: $FRONTEND_PID)"
        echo "- 后端服务通常运行在 http://localhost:8080 (PID: $BACKEND_PID)"
        echo "- 前端日志: /tmp/frontend.log"
        echo "- 后端日志: /tmp/backend.log"
        
        # 尝试打开浏览器
        if command -v xdg-open >/dev/null 2>&1; then
            xdg-open "http://localhost:8000" >/dev/null 2>&1 &
        elif command -v open >/dev/null 2>&1; then
            open "http://localhost:8000" >/dev/null 2>&1 &
        fi
    else
        echo "服务启动可能有问题，请检查日志文件"
        # 清理失败的进程
        stop_services
        exit 1
    fi
}

# 停止服务
stop_services() {
    echo "正在停止服务..."
    
    # 首先尝试通过PID文件停止服务
    if [ -f "$PID_FILE" ]; then
        read -r FRONTEND_PID BACKEND_PID < "$PID_FILE"
        
        # 杀死进程及其所有子进程
        if kill -0 $FRONTEND_PID 2>/dev/null; then
            pkill -P $FRONTEND_PID 2>/dev/null
            kill $FRONTEND_PID 2>/dev/null
            echo "已停止前端服务 (PID: $FRONTEND_PID)"
        fi
        
        if kill -0 $BACKEND_PID 2>/dev/null; then
            pkill -P $BACKEND_PID 2>/dev/null
            kill $BACKEND_PID 2>/dev/null
            echo "已停止后端服务 (PID: $BACKEND_PID)"
        fi
        
        # 删除PID文件
        rm -f "$PID_FILE"
    fi
    
    # 然后确保通过端口停止任何残留进程
    FRONTEND_PORT_PID=$(find_pid_by_port 8000)
    if [ -n "$FRONTEND_PORT_PID" ]; then
        echo "发现前端端口8000仍有进程运行 (PID: $FRONTEND_PORT_PID)，正在停止..."
        kill -9 $FRONTEND_PORT_PID 2>/dev/null
    fi
    
    BACKEND_PORT_PID=$(find_pid_by_port 8080)
    if [ -n "$BACKEND_PORT_PID" ]; then
        echo "发现后端端口8080仍有进程运行 (PID: $BACKEND_PORT_PID)，正在停止..."
        kill -9 $BACKEND_PORT_PID 2>/dev/null
    fi
    
    # 额外检查并停止任何可能的Node.js和Java进程
    NODE_PIDS=$(pgrep -f "http-server" || true)
    if [ -n "$NODE_PIDS" ]; then
        echo "发现残留的Node.js进程，正在停止..."
        kill -9 $NODE_PIDS 2>/dev/null
    fi
    
    JAVA_PIDS=$(pgrep -f "spring-boot" || true)
    if [ -n "$JAVA_PIDS" ]; then
        echo "发现残留的Java进程，正在停止..."
        kill -9 $JAVA_PIDS 2>/dev/null
    fi
    
    echo "所有服务已停止"
}

# 查看服务状态
status_services() {
    echo "服务状态:"
    
    # 检查PID文件中的进程
    if [ -f "$PID_FILE" ]; then
        read -r FRONTEND_PID BACKEND_PID < "$PID_FILE"
        
        if kill -0 $FRONTEND_PID 2>/dev/null; then
            echo "- 前端服务: 运行中 (PID: $FRONTEND_PID)"
        else
            echo "- 前端服务: 已停止 (PID文件存在但进程不存在)"
        fi
        
        if kill -0 $BACKEND_PID 2>/dev/null; then
            echo "- 后端服务: 运行中 (PID: $BACKEND_PID)"
        else
            echo "- 后端服务: 已停止 (PID文件存在但进程不存在)"
        fi
    else
        echo "- PID文件不存在，服务可能未运行"
    fi
    
    # 检查端口占用情况
    FRONTEND_PORT_PID=$(find_pid_by_port 8000)
    if [ -n "$FRONTEND_PORT_PID" ]; then
        echo "- 端口8000: 被占用 (PID: $FRONTEND_PORT_PID)"
    else
        echo "- 端口8000: 空闲"
    fi
    
    BACKEND_PORT_PID=$(find_pid_by_port 8080)
    if [ -n "$BACKEND_PORT_PID" ]; then
        echo "- 端口8080: 被占用 (PID: $BACKEND_PORT_PID)"
    else
        echo "- 端口8080: 空闲"
    fi
}

# 重启服务
restart_services() {
    stop_services
    sleep 2
    start_services
}

# 主函数
main() {
    # 检查目录和命令
    check_directories
    check_commands
    
    # 根据参数选择操作
    case "$1" in
        "start")
            start_services
            ;;
        "stop")
            stop_services
            ;;
        "status")
            status_services
            ;;
        "restart")
            restart_services
            ;;
        "help")
            print_help
            ;;
        "")
            # 默认为启动服务
            start_services
            ;;
        *)
            echo "无效的命令: $1"
            print_help
            exit 1
            ;;
    esac
}

# 执行主函数
main "$@"
